package com.unsiv.blplayer.playtools;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

import android.content.Context;
import android.util.Log;

import com.unsiv.blplayer.util.MyFileHelper;
import com.unsiv.blplayer.util.MyMediaHelper;

/**
 * 
 * @author fanzhen
 * @time 4:07:50 PM Sep 27, 2011
 * @email fanzhen.meng@gmail.com
 */
public class MP3Player {
	private static final String TAG = "MP3Player";
	public static Context context;
	public static String FileType = ".mp3";
	public static String playType = "MP3"; // Emnu类型: MP3,BIGMP3
	public static String folderStr = MyFileHelper.G_Mp3Folder;// 播放文件的路径，默认是Mp3
	public static String strDebug = null;
	// / <summary>
	// / //连播或单播模式;
	// / 默认连播模式(True)-按顺序播放文件
	// / False是单播(repeat重复播放模式)
	// / </summary>
	public static boolean isLinkPlay = true;
	// / <summary>
	// / 是否触发播放完成事件
	// / </summary>
	public static boolean bTriggerEvent = true;
	public static boolean hasBigMP3Delete = false;// 是否有删除大型MP3请求
	public static boolean hasMP3Delete = false;// 是否有删除MP3请求
	public static boolean hasBookIndex = false;// 是否更改过书的编号
	public static boolean hasbigMP3Position = false;// 是否换位请求
	public static boolean hasIsBookindex = false;// 是否选择要交换的书籍
	public static long mpSectionBase = 0; // 默认从第0开始(0+,25+,50+,75+)
	public static long mp3Index = 1; // 默认从第一首MP3开始
	public static long fileOidCode = 1;// Mp3 BigMp3 默认从第一个文件找
	public static int startMillisecs = 0; // 毫秒级(开始)
	public static int endMillisecs = 0; // 毫秒级(结束)
	public static int cellOidCode = 0;// mp3暂存箱的码
	public static int lastOidCode = 0;// 最近一次收到的OID码;
	public static int oidCode = 0;// 默认是-1;1000401;
	public static int lastBigBitOidCode = 0;// 保存BigMp3最后一次Bit码
	public static int lastBigSegmentOidCode = 0;// 保存最后一次声段码
	public static int lastbitOrSegOid = 0;// 最后操作的Oid码
	public static long BookIndex = 1; // 书的编号
	public static long Hundreds = 0;// 百位
	public static long Tens = 0;// 十位
	public static long Bits = 1;// 个位
	public static long SegmentIndex = 1;// 选择声段//默认
	public static long volumeAll;
	// / <summary>
	// / 系统控制
	// / </summary>
	private static String Pcommand, _FName;
	private static boolean Opened, Playing, Paused, Loop, MutedAll, MutedLeft,
			MutedRight;
	private static int rVolume, lVolume, aVolume, tVolume, bVolume, VolBalance;
	public static long Lng;
	private static long Err;
	public static String fileName;

	public MP3Player() {
		// 系统默认播放类型
		playType = "MP3";
		Opened = false;
		Pcommand = "";
		fileName = null;
		Playing = false;
		// Paused = false;
		Loop = false;
		MutedAll = MutedLeft = MutedRight = false;
		rVolume = lVolume = aVolume = tVolume = bVolume = 1000;
		Lng = 0;
		VolBalance = 0;
		Err = 0;

	}

	// / <summary>
	// / 取文件编码
	// / </summary>
	public static long getFileindex() {
		if (playType == "MP3") {
			fileOidCode = mp3Index + mpSectionBase;
		} else {
			fileOidCode = BookIndex;
		}
		return fileOidCode;
	}

	/**
	 * 获取文件的数量
	 */
	public static long getFileCount() {
		int count = 0;
		File folderStr = new File(MyFileHelper.G_Mp3Folder);
		if (folderStr != null && folderStr.isDirectory()) {
			FilenameFilter filter = new FilenameFilter() {
				@Override
				public boolean accept(File file, String fileName) {
					if (fileName.endsWith(".mp3"))
						return true;
					else
						return false;
				}
			};
			String[] mp3s = folderStr.list(filter);
			count = mp3s.length;
		}
		return count;
	}

	// / <summary>
	// / 设置与获取当前播放文件类型
	// / </summary>
	public static void setPlayType(String value) {
		playType = value;
		if (playType == "MP3") {
			folderStr = MyFileHelper.G_Mp3Folder;
		} else {
			folderStr = MyFileHelper.G_BIGMP3Folder;
		}
	}

	// 静音 Volume
	public static void muteAll(boolean value) {
		MutedAll = value;
		if (MutedAll) {
			// MyMediaHelper.setVolume(0, 0);
		} else {
			// MyMediaHelper.setVolume(0.8f, 0.8f);
		}
	}

	// //左声道
	// public boolean setMuteLeft(boolean value)
	// {
	// MutedLeft = value;
	// if (MutedLeft)
	// {
	// Pcommand = "setaudio MediaFile left off";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// else
	// {
	// Pcommand = "setaudio MediaFile left on";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	//
	// }
	// //右声道
	// public boolean setMuteRight(boolean value)
	// {
	// MutedRight = value;
	// if (MutedRight)
	// {
	// Pcommand = "setaudio MediaFile right off";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// else
	// {
	// Pcommand = "setaudio MediaFile right on";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //调节音量
	// public int setVolumeAll(int value)
	// {
	// if (Opened && (value >= 0 && value <= 1000))
	// {
	// aVolume = value;
	// Pcommand = String.Format("setaudio MediaFile volume to {0}", aVolume);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //音量最小化
	// public int setVolumeLeft(int value)
	// {
	// if (Opened && (value >= 0 && value <= 1000))
	// {
	// lVolume = value;
	// Pcommand = String.format("setaudio MediaFile left volume to %1$d",
	// lVolume);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //音量最大化
	// public int setVolumeRight(int value)
	// {
	// if (Opened && (value >= 0 && value <= 1000))
	// {
	// rVolume = value;
	// Pcommand = String.format("setaudio MediaFile right volume to %1$s",
	// rVolume);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //最高声部
	// public int setVolumeTreble(int value)
	// {
	// if (Opened && (value >= 0 && value <= 1000))
	// {
	// tVolume = value;
	// Pcommand = String.Format("setaudio MediaFile treble to {0}", tVolume);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //低音
	// public int setVolumeBass(int value)
	// {
	// if (Opened && (value >= 0 && value <= 1000))
	// {
	// bVolume = value;
	// Pcommand = String.Format("setaudio MediaFile bass to {0}", bVolume);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// //声道
	// public int setBalance(int value)
	// {
	// if (Opened && (value >= -1000 && value <= 1000))
	// {
	// VolBalance = value;
	// if (value < 0)
	// {
	// Pcommand = "setaudio MediaFile left volume to 1000";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// Pcommand = String.Format("setaudio MediaFile right volume to {0}", 1000 +
	// value);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// else
	// {
	// Pcommand = "setaudio MediaFile right volume to 1000";
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// Pcommand = String.Format("setaudio MediaFile left volume to {0}", 1000 -
	// value);
	// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero)) != 0)
	// OnError(new ErrorEventArgs(Err));
	// }
	// }
	// 围绕
	public static boolean Looping;

	// 拖动播放控件 快进 ，快退
	public static void seek(long Millisecs) {
		if (Opened && Millisecs <= Lng) {
			if (Playing) {
				if (Paused) {
					// Pcommand = String.Format("seek MediaFile to {0}",
					// Millisecs);
					// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero))
					// != 0) OnError(new ErrorEventArgs(Err));
				} else {
					// Pcommand = String.Format("seek MediaFile to {0}",
					// Millisecs);
					// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero))
					// != 0) OnError(new ErrorEventArgs(Err));
					// Pcommand = "play MediaFile";
					// if ((Err = mciSendString(Pcommand, null, 0, IntPtr.Zero))
					// != 0) OnError(new ErrorEventArgs(Err));
				}
			}
		}
	}

	// 播放文件的 长度
	private static void CalculateLength() {
		Lng = MyMediaHelper.mp.getDuration(); // 单位/毫秒
	}

	public static long getAudioLength() {
		if (Opened)
			return Lng;
		else
			return 0;
	}

	// 关闭播放器
	public static void close() {
		if (Opened) {
			MyMediaHelper.mp.stop();
			try {
				MyMediaHelper.mp.setDataSource("");
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Opened = false;
			Playing = false;
		}
	}

	// / <summary>
	// / 初始化－从第一首播放
	// / </summary>
	public static void init() {
		MP3Player.mpSectionBase = 0;
		MP3Player.mp3Index = 1;
		stop();
	}

	// / <summary>
	// / 播放与暂停MP3
	// / </summary>
	public static void playMp3() {
		bTriggerEvent = true;
		close(); // 关闭当前文件
		open();
		play();
	}

	public static void playMp3(String fileName) {
		MyMediaHelper.playFromAbsolutePath(fileName);
	}

	// 播放器状态
	public static String getStatus() {
		// String sCommand = "status MediaFile mode";
		// StringBuilder ret = new StringBuilder();
		// mciSendString(sCommand, ret, 10, IntPtr.Zero);
		// return ret.ToString().Trim();
		return "";
	}

	// / <summary>
	// / 播放上一首
	// / </summary>
	public static void playPre() {
		if (MP3Player.isLinkPlay) // 是否连播
		{
			mp3Index--;
		} else // 单播
		{
			cellOidCode--;
		}
		if (mp3Index == 0) {
			mp3Index = getFileCount();

		}
		playMp3();

	}

	// / <summary>
	// / 播放下一首
	// / </summary>
	public static void playNext() {
		if (MP3Player.isLinkPlay) // 是否连播
		{
			mp3Index++;
		} else {
			cellOidCode++;
		}
		if (mp3Index > getFileCount()) {
			mp3Index = 1;
		}
		playMp3();
	}

	// / <summary>
	// / 根据MP3序号打开需要播放的文件名
	// / </summary>
	// / <param name="_songIndex"></param>
	public static void open() {
		int fileIndex = (int) getFileindex();
		fileName = MyFileHelper.getFileName(fileIndex, folderStr, FileType);
		String selectFileName = MyFileHelper.G_Mp3Folder + fileName;
		if (!new File(selectFileName).exists()) {
			return;
		}
		if (!Opened) {
			try {
				MyMediaHelper.mp.setDataSource(selectFileName);
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			_FName = selectFileName;
			Opened = true;
			Playing = false;
			CalculateLength();

		} else {
			close();
			open();
		}
	}

	// 播放当前MP3
	public static void play() {
		if (playType.equalsIgnoreCase("BIGMP3")) {
			// 第1页第1节对应的时间(开始，结束)（8byte） 8~15byte
			// 第1页第二节对应的时间(开始，结束)（8byte） 16~23 byte
			String IBPfullName = MyFileHelper.G_BIGMP3Folder
					+ fileName.replace(".mp3", ".ibp");

			if (!new File(IBPfullName).exists()) // 如果存在.IPB文件
			{
				// SegmentIndex = 1;
				String MillisecsStr = String.valueOf(Hundreds)
						+ String.valueOf(Tens) + String.valueOf(Bits)
						+ String.valueOf(SegmentIndex);
				startMillisecs = Integer.parseInt(MillisecsStr);
			} else // 如果存在文件
			{
				// SegmentIndex = 3;
				long page = Hundreds * 100 + Tens * 10 + Bits;
				long startPos = ((page - 1) * 10 + SegmentIndex) * 8;
				InputStream is;

				try {
					is = new FileInputStream(IBPfullName);
					byte[] ifromBytes = new byte[4];
					byte[] itoBytes = new byte[4];
					is.read(ifromBytes, (int) startPos, 4);
					is.read(itoBytes, (int) startPos + 4, 4);
					ByteBuffer bb = ByteBuffer.wrap(ifromBytes);
					startMillisecs = bb.getInt();
					ByteBuffer bb2 = ByteBuffer.wrap(itoBytes);
					endMillisecs = bb2.getInt();
					is.close();
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				} catch (Exception e) {
					Log.i(TAG, "caught and ignored. " + "Using default values.");
				}
			}
		}// if(PlayType.ToUpper() == "BIGMP3")

		if (Opened) {
			if (!Playing) {
				Playing = true;
				if ((startMillisecs > 0) && ((long) startMillisecs <= Lng)) {
					MyMediaHelper.mp.seekTo(startMillisecs);
				}
			} else {
				if (!Paused) {
					MyMediaHelper.mp.start();
				}
			}
		}
	}

	// 暂停Mp3
	public static void pause() {
		if (Opened) {
			if (!Paused) // 正在播放 暂停
			{
				Paused = true;
				MyMediaHelper.mp.pause();
			} else // 暂停时 触发
			{
				Paused = false;
				MyMediaHelper.mp.start();
			}
		}
	}

	// 停止Mp3
	public static void stop() {
		if (Opened) {
			Playing = false;
			Paused = false;
			MyMediaHelper.mp.start();
			if (MyMediaHelper.mp.isPlaying()) {
				MyMediaHelper.mp.stop();
			}
		}
	}

	// 现在的位置
	public long getCurrentPosition() {
		if (Opened && Playing) {
			return MyMediaHelper.mp.getCurrentPosition();
		} else
			return 0;
	}

	// / <summary>
	// / MP3删除对应的文件
	// / </summary>
	// / <param name="oidCode">Oid码 代表文件的位置</param>
	// / <param name="FileFolder">文件的路径</param>
	public static void deleteMp3Case() {
		// if (mp3Index >= 1)
		// {
		// String fileName = Application.StartupPath + FolderStr;
		// int i = 0;
		// String path = Application.StartupPath + FolderStr;
		// if (File.Exists(path)) { return; }
		// DirectoryInfo direfile = new DirectoryInfo(path);
		// if (direfile.GetFiles(FileType).Length < mp3Index) { return; }
		// foreach (System.IO.FileInfo fi in direfile.GetFiles(FileType))
		// {
		// i++;
		// fileName = fi.FullName;
		// if (mp3Index == i)
		// {
		// break;
		// }
		// }
		// if (direfile.GetFiles(FileType).Length > 0)
		// {
		// File.Delete(fileName);
		// }
		// }
	}

	// / <summary>
	// / 大型MP3删除对应 的文件
	// / </summary>
	// / <param name="oidCode">Oid码 代表文件的位置</param>
	// / <param name="FileFolder">文件的路径</param>
	public void deleteBigMp3Case() {
		// if (BookIndex >= 1)
		// {
		// String fileName = Application.StartupPath + FolderStr;
		// int i = 0;
		// String path = Application.StartupPath + FolderStr;
		// if (File.Exists(path)) { return; }
		// DirectoryInfo direfile = new DirectoryInfo(path);
		// if (direfile.GetFiles(FileType).Length < BookIndex) { return; }
		// foreach (System.IO.FileInfo fi in direfile.GetFiles(FileType))
		// {
		// i++;
		// fileName = fi.FullName;
		// if (BookIndex == i)
		// {
		// break;
		// }
		// }
		// if (direfile.GetFiles(FileType).Length > 0)
		// {
		// string fullPath= Path.GetDirectoryName(fileName);
		// String ipbFileName = Path.GetFileNameWithoutExtension(fileName) +
		// ".ibp";
		// string IBPfullName = fullPath + "\\" + ipbFileName;//Ibp文件
		//
		// File.Delete(fileName);
		// File.Delete(IBPfullName);
		// }
		// }
	}

	public String OnePositionName = null;// 第一个OId文件的位置名称

	// / <summary>
	// / 获得OId文件的名称
	// / </summary>
	public String onePosition() {
		// String fileName = null;
		// String ThisPositionName = null;
		// int i = 0;
		// String path = Application.StartupPath + FolderStr;
		// if (File.Exists(path)) { return fileName; }
		// DirectoryInfo direfile = new DirectoryInfo(path);
		// if (direfile.GetFiles(FileType).Length < BookIndex) { return
		// fileName; }
		// foreach (System.IO.FileInfo fi in direfile.GetFiles(FileType))
		// {
		// i++;
		// fileName = fi.FullName;
		// if (BookIndex == i)
		// {
		// break;
		// }
		// }
		// ThisPositionName = Path.GetFileName(fileName);
		// return ThisPositionName;
		return null;
	}

	// / <summary>
	// / 更换文件名称 换位
	// / </summary>
	// / <returns></returns>
	public static void updatePosition() {
		// string fileName = string.Empty;
		// string TwoPositionName = string.Empty;
		// int i = 0;
		// String path = Application.StartupPath + FolderStr;
		// if (File.Exists(path)) { return; }
		// DirectoryInfo direfile = new DirectoryInfo(path);
		// if (direfile.GetFiles(FileType).Length < BookIndex) { return; }
		// foreach (System.IO.FileInfo fi in direfile.GetFiles(FileType))
		// {
		// i++;
		// fileName = fi.FullName;
		// if (BookIndex == i)
		// {
		// break;
		// }
		// }
		// TwoPositionName = Path.GetFileName(fileName);//记住第二个原文件名
		// if (File.Exists(fileName))
		// {
		// string TwoPath = path + "\\" + TwoPositionName + "w";//第二个选择的名称 路径
		// string OnePath = path + "\\" + OnePositionName;//第一个选择的名称 路径
		//
		// string fullPathOne = Path.GetDirectoryName(OnePath);
		// String ipbFileNameOne = Path.GetFileNameWithoutExtension(OnePath) +
		// ".ibp";
		// string IBPfullNameOne = fullPathOne + "\\" +
		// ipbFileNameOne;//第一个Ibp文件
		//
		// string fullPathTwo = Path.GetDirectoryName(TwoPath);
		// String ipbFileNameTwo = Path.GetFileNameWithoutExtension(TwoPath) +
		// ".ibp";
		// string IBPfullNameTwo = fullPathTwo + "\\" +
		// ipbFileNameTwo;//第二个Ibp文件
		// string UpIBPfullNameTwo = fullPathTwo + "\\" +
		// ipbFileNameTwo+"w";//修改过的第二个Ibp文件
		//
		//
		// File.Move(fileName, TwoPath); //修改第二个文件名
		// File.Move(IBPfullNameTwo, UpIBPfullNameTwo); //修改第二个Ibp
		//
		// File.Move(OnePath, TwoPath.Substring(0, TwoPath.Length -
		// 1));//把第二个文件名赋值给第一个
		// File.Move(IBPfullNameOne, UpIBPfullNameTwo.Substring(0,
		// UpIBPfullNameTwo.Length - 1));//把第二个文件名赋值给第一个
		//
		// File.Move(TwoPath, OnePath);//第一个赋值给第二个
		// File.Move(UpIBPfullNameTwo, IBPfullNameOne);//第一个赋值给第二个
		// }
	}
}